/*
 * UART.h - UART驱动头文件
 * 适用于MSPM0G3507微控制器
 */

#ifndef UART_H_
#define UART_H_

#include "ti_msp_dl_config.h"
#include <stdint.h>
#include <stdbool.h>

// UART缓冲区大小定义
#define UART_TX_BUFFER_SIZE     256
#define UART_RX_BUFFER_SIZE     256

// UART状态定义
typedef enum {
    UART_STATUS_SUCCESS = 0,
    UART_STATUS_ERROR,
    UART_STATUS_BUSY,
    UART_STATUS_TIMEOUT,
    UART_STATUS_BUFFER_FULL,
    UART_STATUS_BUFFER_EMPTY
} UART_Status_t;

// UART配置结构体
typedef struct {
    UART_Regs *instance;        // UART实例
    uint32_t baudRate;          // 波特率
    bool enableTxInterrupt;     // 发送中断使能
    bool enableRxInterrupt;     // 接收中断使能
    bool enableFIFO;            // FIFO使能
} UART_Config_t;

// UART缓冲区结构体
typedef struct {
    uint8_t buffer[UART_TX_BUFFER_SIZE];
    volatile uint16_t head;
    volatile uint16_t tail;
    volatile uint16_t count;
} UART_TxBuffer_t;

typedef struct {
    uint8_t buffer[UART_RX_BUFFER_SIZE];
    volatile uint16_t head;
    volatile uint16_t tail;
    volatile uint16_t count;
} UART_RxBuffer_t;

// UART句柄结构体
typedef struct {
    UART_Regs *instance;        // UART实例
    UART_TxBuffer_t txBuffer;   // 发送缓冲区
    UART_RxBuffer_t rxBuffer;   // 接收缓冲区
    volatile bool txBusy;       // 发送忙标志
    volatile bool rxBusy;       // 接收忙标志
} UART_Handle_t;

// 函数声明
/**
 * @brief 初始化UART驱动
 * @param handle UART句柄指针
 * @param config UART配置指针
 * @return UART_Status_t 状态码
 */
UART_Status_t UART_Init(UART_Handle_t *handle, const UART_Config_t *config);

/**
 * @brief 发送单个字节
 * @param handle UART句柄指针
 * @param data 要发送的数据
 * @return UART_Status_t 状态码
 */
UART_Status_t UART_SendByte(UART_Handle_t *handle, uint8_t data);

/**
 * @brief 发送数据缓冲区
 * @param handle UART句柄指针
 * @param data 数据缓冲区指针
 * @param length 数据长度
 * @return UART_Status_t 状态码
 */
UART_Status_t UART_SendData(UART_Handle_t *handle, const uint8_t *data, uint16_t length);

/**
 * @brief 发送字符串
 * @param handle UART句柄指针
 * @param str 字符串指针
 * @return UART_Status_t 状态码
 */
UART_Status_t UART_SendString(UART_Handle_t *handle, const char *str);

/**
 * @brief 接收单个字节
 * @param handle UART句柄指针
 * @param data 接收数据的指针
 * @return UART_Status_t 状态码
 */
UART_Status_t UART_ReceiveByte(UART_Handle_t *handle, uint8_t *data);

/**
 * @brief 接收数据到缓冲区
 * @param handle UART句柄指针
 * @param data 数据缓冲区指针
 * @param length 期望接收的长度
 * @param receivedLength 实际接收的长度指针
 * @return UART_Status_t 状态码
 */
UART_Status_t UART_ReceiveData(UART_Handle_t *handle, uint8_t *data, uint16_t length, uint16_t *receivedLength);

/**
 * @brief 获取接收缓冲区中的数据数量
 * @param handle UART句柄指针
 * @return uint16_t 数据数量
 */
uint16_t UART_GetRxDataCount(UART_Handle_t *handle);

/**
 * @brief 获取发送缓冲区中的空闲空间
 * @param handle UART句柄指针
 * @return uint16_t 空闲空间大小
 */
uint16_t UART_GetTxFreeSpace(UART_Handle_t *handle);

/**
 * @brief 清空接收缓冲区
 * @param handle UART句柄指针
 */
void UART_FlushRxBuffer(UART_Handle_t *handle);

/**
 * @brief 清空发送缓冲区
 * @param handle UART句柄指针
 */
void UART_FlushTxBuffer(UART_Handle_t *handle);

/**
 * @brief UART中断处理函数
 * @param handle UART句柄指针
 */
void UART_IRQHandler(UART_Handle_t *handle);

#endif /* UART_H_ */
